Contents
  1. 1. 进程间通信 (Inter Process Communication)
    1. 1.1. 目的
    2. 1.2. Linux进程通信
      1. 1.2.1. 1.管道
      2. 1.2.2. 2. 信号(signal)
      3. 1.2.3. 3. 消息队列
      4. 1.2.4. 4. 共享内存
      5. 1.2.5. 5. 信号量
      6. 1.2.6. 6. 套接字(socket)
    3. 1.3. Windows 进程通信
    4. 1.4. https://blog.csdn.net/c_base_jin/article/details/72795113

进程间通信 (Inter Process Communication)

Linux : 管道,消息队列,共享内存,信号量,套接口, 信号
Windows : 消息(linux信号)、共享内存、邮件槽(mailslot) (点对点消息队列)、管道、socket、
剪切板、动态数据交换、文件映射、对象链接与嵌入、远程过程调用、动态连接库、WM_COPYDATA

目的

进程传输、共享数据、通知、资源共享、进程控制

Linux进程通信

  1. 管道(pipe),流管道(s_pipe)和命名管道(FIFO)

  2. 信号(signal)

  3. 消息队列

  4. 共享内存

  5. 信号量

  6. 套接字(socket)

    参考:https://www.jianshu.com/p/c1015f5ffa74

1.管道

这种通讯方式有俩种限制:

  1. 半双工的通信,数据只能单向流动

  2. 只能在具有亲缘关系(父子进程或兄弟进程)间流动

    匿名管道

    流管道(s_piple): 去除了第一种限制,可以双向传输.

    有名管道(FIFO):克服了管道没有名字的限制,它还允许无亲缘关系进程间的通信,有名管道的名字存在于文件系统中,内容存放在内存中。

实质

​ 管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据
管道一端的进程顺序的将数据写入缓冲区
另一端的进程则顺序的读出数据
该缓冲区可以看做是一个循环队列,读和写的位置都是自动增长的,不能随意改变,一个数据只能被读一次,读出来以后在缓冲区就不复存在了。
当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写

2. 信号(signal)
  • 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。

    (1)信号被某个进程产生,并设置此信号传递的对象(一般为对应进程的pid),然后传递给操作系统;
    (2)操作系统根据接收进程的设置(是否阻塞)而选择性的发送给接收者,如果接收者阻塞该信号(且该信号是可以阻塞的),操作系统将暂时保留该信号,而不传递,直到该进程解除了对此信号的阻塞(如果对应进程已经退出,则丢弃此信号),如果对应进程没有阻塞,操作系统将传递此信号。
    (3)目的进程接收到此信号后,将根据当前进程对此信号设置的预处理方式,暂时终止当前代码的执行,保护上下文(主要包括临时寄存器数据,当前程序位置以及当前CPU的状态)、转而执行中断服务程序,执行完成后在回复到中断的位置。当然,对于抢占式内核,在中断返回时还将引发新的调度。

3. 消息队列
  • 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
  • 与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
  • 另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达
4. 共享内存
  • 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。
  • 由于多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。
5. 信号量

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。

6. 套接字(socket)

套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

优缺点比较:

  1. 管道:速度慢,容量有限,只有父子进程能通讯
  2. FIFO:任何进程间都能通讯,但速度慢
  3. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  4. 信号量:不能传递复杂消息,只能用来同步
  5. 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

Windows 进程通信

https://blog.csdn.net/c_base_jin/article/details/72795113

Contents
  1. 1. 进程间通信 (Inter Process Communication)
    1. 1.1. 目的
    2. 1.2. Linux进程通信
      1. 1.2.1. 1.管道
      2. 1.2.2. 2. 信号(signal)
      3. 1.2.3. 3. 消息队列
      4. 1.2.4. 4. 共享内存
      5. 1.2.5. 5. 信号量
      6. 1.2.6. 6. 套接字(socket)
    3. 1.3. Windows 进程通信
    4. 1.4. https://blog.csdn.net/c_base_jin/article/details/72795113